﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using SAW_Core;
using WLMCoreLibrary;
using System.Configuration;
using System.IO;
using System.Diagnostics;
using System.Configuration;

namespace SAWPOS
{
	public partial class POSFORM : Form
	{

		#region private Fields
		private List<Producto> productList;
		private List<Cliente> clientList;
		private List<string> descriptionsList;
		private List<string> codeList;
		private int searchRowId = -1;
		private Cliente selectedClient;
		private bool clientDirty = false;
		private bool gridDirty=false;
		private Venta actualSell=new Venta();
		private frmAltaProducto panelProductos;
		#endregion

		#region FormEvents
		void eventDatosDirty(object sender, EventArgs a)
		{
			clientDirty = true;
			statusLabel.Text = sender.ToString();
			btnNuevaVenta.Enabled = VerifySellData();
			btnGuardarCompra.Enabled = VerifySellData();
			btnFacturar.Enabled = VerifyInvoiceData();
		}

		private void UpdateTotals(object sender, EventArgs e)
		{
			UpdateTotals();
		}

		private void txtSubTotal_TextChanged(object sender, EventArgs e)
		{
			UpdateTotals();
		}

		private void txtDescPorc_TextChanged(object sender, EventArgs e)
		{
			UpdateTotals();
		}

		private void gridItems_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e)
		{
			if (e.Control is DataGridViewTextBoxEditingControl)
			{


				((TextBox)e.Control).CharacterCasing = CharacterCasing.Upper;
				DataGridViewTextBoxEditingControl te =
				(DataGridViewTextBoxEditingControl)e.Control;

				te.AutoCompleteMode = AutoCompleteMode.Suggest;

				te.AutoCompleteSource = AutoCompleteSource.CustomSource;

				DataGridView dgv = (DataGridView)sender; //reference to theoriginal grid
				int col = dgv.CurrentCell.ColumnIndex; //columnindex if thecurrent cell
				switch (col)
				{
					case 3:
						te.AutoCompleteCustomSource.AddRange(codeList.ToArray());
						break;
					case 4:
						te.AutoCompleteCustomSource.AddRange(descriptionsList.ToArray());
						break;
					default:
						te.AutoCompleteCustomSource.Clear();
						break;
				}


			}
		}

		private void gridItems_CellEndEdit(object sender,
	DataGridViewCellEventArgs e)
		{
			DataGridViewCell celda = gridItems[e.ColumnIndex, e.RowIndex];
			btnNuevaVenta.Enabled = VerifySellData();
			btnGuardarCompra.Enabled = VerifySellData();
			btnFacturar.Enabled = VerifyInvoiceData();
			try
			{
				DataGridViewRow row = gridItems.Rows[e.RowIndex];
				//MessageBox.Show(e.ColumnIndex.ToString());
				if (e.ColumnIndex == 1 || e.ColumnIndex == 5)
				{
					if (celda.Value.ToString() == "")
						celda.Value = "0";
					UpdateTotals();
				}
				else
				{

					if (celda.Value.ToString() != "")
					{
						Producto it;
						bool productPreviuslyEntered=false;
						int idRowEnteredPrev=0;
						if (celda.ColumnIndex == 3)
						{
							it = productList.Find(o => o.Clave.ToUpper() == celda.Value.ToString().ToUpper());
						}
						else
						{
							it = productList.Find(o => o.Descripcion.ToUpper() == celda.Value.ToString().ToUpper());
						}
						//codeList.Remove(it.Clave.ToUpper());
						//descriptionsList.Remove(it.Descripcion.ToUpper());

						if (it != null)
						{
							for (int x = 0; x < gridItems.Rows.Count; x++)
							{

								if (gridItems["claveItem", x].Value != null)
								{
									if (gridItems["claveItem", x].Value.ToString() == it.Clave.ToUpper() && x != e.RowIndex)
									{
										productPreviuslyEntered = true;
										idRowEnteredPrev = x;
									}
								}
							}
							if (productPreviuslyEntered)
							{
								decimal cantidadActual= Convert.ToDecimal(gridItems["cantidad", idRowEnteredPrev].Value);
								cantidadActual += 1M;
								gridItems["cantidad", idRowEnteredPrev].Value = cantidadActual;

							}
							else
							{
								row.Cells["idProducto"].Value = it.id;
								row.Cells["precio"].Value = it.Precio1;
								row.Cells["importe"].Value = it.Precio1 * 3;
								row.Cells["cantidad"].Value = 1M;
								row.Cells["claveItem"].Value = it.Clave.ToUpper();
								row.Cells["Descripcion"].Value = it.Descripcion;
								row.Cells["unidadMedida"].Value = it.UnidadMedida;
								//row.Cells["categoria"].Value = it.Categoria.ToUpper();
								//row.Cells["Linea"].Value = it.Linea.ToUpper();
								//row.Cells["marca"].Value = it.Marca.ToUpper();
								statusLabel.Text = "Producto '" + it.Descripcion + "' seleccionado";
							}
							UpdateTotals();
							row.Cells["cantidad"].Selected = true;
							gridItems.CurrentCell = gridItems.Rows[gridItems.Rows.Count - 1].Cells["claveItem"];
							gridItems.BeginEdit(true);
							if (productPreviuslyEntered)
								gridItems.Rows.RemoveAt(e.RowIndex);
						}
						else
						{
							panelProductos = new frmAltaProducto(celda.Value.ToString());
							panelProductos.Show();
							panelProductos.ProductAdded += HandleProductAdd;

						}


					}

				}
			}
			catch (Exception ex)
			{
				statusLabel.Text = ex.Message;
			}
		}


		private void HandleProductSelect(object sender, EventArgs e)
		{
			Producto prod=(Producto)sender;
			DataGridViewRow row=findProductRow(prod);
			if (row == null)
			{
				int idRow= gridItems.Rows.Add();
				row = gridItems.Rows[idRow];
				row.Cells["idProducto"].Value = prod.id;
				row.Cells["precio"].Value = prod.Precio1;
				row.Cells["importe"].Value = prod.Precio1 * 3;
				row.Cells["cantidad"].Value = 1M;
				row.Cells["claveItem"].Value = prod.Clave.ToUpper();
				row.Cells["Descripcion"].Value = prod.Descripcion;
				row.Cells["unidadMedida"].Value = prod.UnidadMedida;

			}
			else
			{
				decimal cantidadActual= Convert.ToDecimal(row.Cells["cantidad"].Value);
				cantidadActual += 1M;
				row.Cells["cantidad"].Value = cantidadActual;
			}
			UpdateTotals();
			return;
		}

		private void HandleProductAdd(object sender, EventArgs e)
		{
			Producto prod=(Producto)sender;
			DataGridViewRow row=findProductRow(prod);
			if (row == null)
			{

				row.Cells["idProducto"].Value = prod.id;
				row.Cells["precio"].Value = prod.Precio1;
				row.Cells["importe"].Value = prod.Precio1 * 3;
				row.Cells["cantidad"].Value = 1M;
				row.Cells["claveItem"].Value = prod.Clave.ToUpper();
				row.Cells["Descripcion"].Value = prod.Descripcion;
				row.Cells["unidadMedida"].Value = prod.UnidadMedida;
				//row.Cells["categoria"].Value = it.Categoria.ToUpper();
				//row.Cells["Linea"].Value = it.Linea.ToUpper();
				//row.Cells["marca"].Value = it.Marca.ToUpper();
				statusLabel.Text = "Producto '" + prod.Descripcion + "' seleccionado";
				LoadClientsProducts();
			}
			else
			{

				row.Cells["idProducto"].Value = prod.id;
				row.Cells["precio"].Value = prod.Precio1;
				row.Cells["importe"].Value = prod.Precio1 * 3;
				row.Cells["cantidad"].Value = 1M;
				row.Cells["claveItem"].Value = prod.Clave.ToUpper();
				row.Cells["Descripcion"].Value = prod.Descripcion;
				row.Cells["unidadMedida"].Value = prod.UnidadMedida;
				//row.Cells["categoria"].Value = it.Categoria.ToUpper();
				//row.Cells["Linea"].Value = it.Linea.ToUpper();
				//row.Cells["marca"].Value = it.Marca.ToUpper();
				statusLabel.Text = "Producto '" + prod.Descripcion + "' seleccionado";
				LoadClientsProducts();
			}
			UpdateTotals();

			return;
		}

		private DataGridViewRow findProductRow(Producto prod)
		{
			foreach (DataGridViewRow row in gridItems.Rows)
			{
				if (row.Cells["claveItem"].Value != null)
					if (row.Cells["claveItem"].Value.ToString() == prod.Clave)
					{
						return row;
					}
			}
			return null;
		}

		private void cerrarToolStripMenuItem_Click(object sender, EventArgs e)
		{
			Application.Exit();
		}

		private void button3_Click(object sender, EventArgs e)
		{
		}

		private void btnGuardarCompra_Click(object sender, EventArgs e)
		{
			GenerateSell(false);
		}

		private void btnNewSale_Click(object sender, EventArgs e)
		{
			CleanFormData();
		}

		private void importarToolStripMenuItem_Click(object sender, EventArgs e)
		{
			CVSImporter importador = new CVSImporter();
			importador.SelectFile();
		}

		private void productosToolStripMenuItem_Click(object sender, EventArgs e)
		{

			
		}

		private void buscarProductoToolStripMenuItem_Click(object sender, EventArgs e)
		{
			if (gridItems.CurrentRow != null)
				searchRowId = gridItems.CurrentRow.Index;
			MessageBox.Show(searchRowId.ToString());
		}

		private void clientesToolStripMenuItem_Click(object sender, EventArgs e)
		{
			PDFPrinter.PrintPDF("<!DOCTYPE html><html><head></head><body>PROBANDO</body></html>", "", false);

		}

		private void gridItems_CellContentClick(object sender, DataGridViewCellEventArgs e)
		{
			if (e.ColumnIndex == 7)
				gridItems.Rows.RemoveAt(e.RowIndex);
		}

		private void txtCantidadPagada_TextChanged(object sender, EventArgs e)
		{
			UpdateTotals();
		}

		private void notasDeVentaToolStripMenuItem_Click(object sender, EventArgs e)
		{
			ListadoNotas listaNotas=new ListadoNotas();
			listaNotas.SellNoteSelected += new SellNoteSelectedHandler(CargarNotaVenta);
			listaNotas.Show();
			listaNotas.loadSellNotes();
		}

		private void respaldarDBToolStripMenuItem_Click(object sender, EventArgs e)
		{
			try
			{
				DateTime backupTime = DateTime.Now;
				int year = backupTime.Year;
				int month = backupTime.Month;
				int day = backupTime.Day;
				int hour = backupTime.Hour;
				int minute = backupTime.Minute;
				int second = backupTime.Second;
				int ms = backupTime.Millisecond;

				String tmestr = backupTime.ToString();
				System.IO.DirectoryInfo directorio = new System.IO.DirectoryInfo(ConfigurationSettings.AppSettings["PathRespaldo"]);
				if (!directorio.Exists)
					directorio.Create();
				tmestr = ConfigurationSettings.AppSettings["PathRespaldo"] + ConfigurationSettings.AppSettings["DBName"] + "-" + year + month.ToString("00") + day.ToString("00") + "-" + hour.ToString("00") + minute.ToString("00") + second.ToString("00") + ".sql";
				StreamWriter file = new StreamWriter(tmestr);
				ProcessStartInfo proc = new ProcessStartInfo();
				proc.FileName = "mysqldump";
				proc.RedirectStandardInput = false;
				proc.RedirectStandardOutput = true;
				proc.UseShellExecute = false;
				proc.Arguments = ConfigurationSettings.AppSettings["DBName"] + " --password=" + ConfigurationSettings.AppSettings["DBPass"] + " --user=" + ConfigurationSettings.AppSettings["DBUser"] + "";

				Process p = Process.Start(proc);
				string res;
				res = p.StandardOutput.ReadToEnd();
				file.WriteLine(res);
				p.WaitForExit();
				file.Close();

				System.IO.FileInfo file1 = new System.IO.FileInfo(tmestr);

				//file.Delete();



			}

			catch (IOException ex)
			{
				//Response.Write("Disk full or other IO error , unable to backup!");
			}
		}

		private void btnFacturar_Click(object sender, EventArgs e)
		{
			GenerateSell(true);
		}

		/// <summary>
		/// Carga la una nota de venta y es visualizada en el formulario POS
		/// </summary>
		/// <param name="idNotaVenta">identificador de la venta en la DB</param>
		private void CargarNotaVenta(object sender, DataGridViewCellEventArgs e)
		{
			DataGridView grid= (DataGridView)sender;
			int idNotaVenta=Convert.ToInt32(grid.Rows[e.RowIndex].Cells[0].Value);
			LoadSellNote(idNotaVenta);
		}

		private void CargarFactura(object sender, DataGridViewCellEventArgs e)
		{
			DataGridView grid= (DataGridView)sender;
			int idNotaVenta=Convert.ToInt32(grid.Rows[e.RowIndex].Cells[0].Value);
			LoadInvoice(idNotaVenta);
		}

		private void btnNuevaVenta_Click(object sender, EventArgs e)
		{
			CleanFormData();
		}

		private void btnFacturar_Click_1(object sender, EventArgs e)
		{


			if (MessageBox.Show("Desea Facturar la venta actual", "Facturar?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
			{
				btnFacturar.Enabled = false;
				btnGuardarCompra.Enabled = false;
				GenerateInvoice();
				btnFacturar.Enabled = false;
			}
		}

		private void facturasToolStripMenuItem_Click(object sender, EventArgs e)
		{
			ListadoNotas listaNotas=new ListadoNotas();
			listaNotas.InvoiceSelected += new InvoiceSelectedHandler(CargarFactura);
			listaNotas.Show();
			listaNotas.loadInvoices();
		}
		#endregion

		#region Contructors

		/// <summary>
		/// Llamado de las funciondes de inicializacion del formulario de POS
		/// </summary>
		public POSFORM()
		{
			InitializeComponent();
			InitPOSForm();
			CleanFormData();
		}
		#endregion

		#region Private Methods
		private void LoadClientsProducts()
		{
			dbConnector conexion = new dbConnector(ConfigurationSettings.AppSettings["cadenaConexion"].ToString());
			productList = new ProductoCollection(ref conexion).Elementos;
			clientList = new ClientesCollection(ref conexion).Elementos;
			conexion.CloseConnection();
			descriptionsList = new List<string>();
			codeList = new List<string>();
			foreach (Producto proser in productList)
			{
				descriptionsList.Add(proser.Descripcion.ToUpper());
				codeList.Add(proser.Clave.ToUpper());
			}
			txtRFCReceptor.AutoCompleteMode = AutoCompleteMode.Suggest;
			txtRFCReceptor.AutoCompleteSource = AutoCompleteSource.CustomSource;
			foreach (Cliente cli in clientList)
				txtRFCReceptor.AutoCompleteCustomSource.Add(cli.RFC);
		}

		/// <summary>
		/// Inits the POS form.
		/// </summary>
		private void InitPOSForm()
		{

			LoadClientsProducts();
			txtRazonSocial.TextChanged += eventDatosDirty;
			txtCalle.TextChanged += eventDatosDirty;
			txtNoExterior.TextChanged += eventDatosDirty;
			txtNoInterior.TextChanged += eventDatosDirty;
			txtColonia.TextChanged += eventDatosDirty;
			txtLocalidad.TextChanged += eventDatosDirty;
			txtMunicipio.TextChanged += eventDatosDirty;
			txtEstado.TextChanged += eventDatosDirty;
			txtCP.TextChanged += eventDatosDirty;

			txtRFCReceptor.TextChanged += delegate(object obj, EventArgs e)
			{
				clientDirty = true;
				selectedClient = clientList.Find(cli => cli.RFC == txtRFCReceptor.Text);
				if (selectedClient != null)
				{
					txtRazonSocial.Text = selectedClient.RazonSocial;
					txtCalle.Text = selectedClient.DireccionFacturacion.Calle;
					txtNoExterior.Text = selectedClient.DireccionFacturacion.NumeroExterior;
					txtNoInterior.Text = selectedClient.DireccionFacturacion.NumeroInterior;
					txtColonia.Text = selectedClient.DireccionFacturacion.Colonia;
					txtLocalidad.Text = selectedClient.DireccionFacturacion.Ciudad;
					txtMunicipio.Text = selectedClient.DireccionFacturacion.Municipio;
					txtEstado.Text = selectedClient.DireccionFacturacion.Estado;
					txtCP.Text = selectedClient.DireccionFacturacion.CP;
					clientDirty = false;

				}
			};
		}

		/// <summary>
		/// Determines whether [is form open] [the specified tipo].
		/// </summary>
		/// <param name="tipo">The tipo.</param>
		/// <returns>
		///   <c>true</c> if [is form open] [the specified tipo]; otherwise, <c>false</c>.
		/// </returns>
		private bool isFormOpen(Type tipo)
		{
			Form[] listaForm = MdiChildren;
			foreach (Form forma in listaForm)
			{
				if (forma.GetType() == tipo)
				{
					forma.Focus();
					return true;
				}
			}
			return false;
		}

		/// <summary>
		/// Finds the product.
		/// </summary>
		/// <param name="product">The product.</param>
		/// <param name="busqueda">The busqueda.</param>
		/// <returns></returns>
		private static bool FindProduct(Producto product, string busqueda)
		{
			if (product.Descripcion == busqueda)
				return true;
			else
				return false;
		}

		/// <summary>
		/// Actualiza los totales de el POS form tomando en cuenta los precios e importes del grid
		/// </summary>
		private void UpdateTotals()
		{
			try
			{
				decimal subtotal = 0;
				for (int x = 0; x < gridItems.Rows.Count; x++)
				{

					if (gridItems["precio", x].Value != null)
					{
						gridItems["importe", x].Value = Convert.ToDecimal(gridItems["cantidad", x].Value) * Convert.ToDecimal(gridItems["precio", x].Value.ToString().Replace("$", ""));
						subtotal += Convert.ToDecimal(gridItems["importe", x].Value.ToString().Replace("$", ""));
					}
				}


				decimal descuentoPorcentaje = Convert.ToDecimal(txtDescPorc.Text);
				decimal subTotal = subtotal - (subtotal * (descuentoPorcentaje / 100));
				decimal iva = subTotal * 0.16M;
				decimal total = subTotal + iva;
				decimal cambio=WLMFunctions.MonedaADecimal(txtCantidadPagada.Text) - total;
				txtSubTotal.Text = subtotal.ToString("C");
				txtDescuento.Text = (subtotal * (descuentoPorcentaje / 100)).ToString("C");
				txtIVA.Text = iva.ToString("C");
				txtTotal.Text = total.ToString("C");
				txtCambio.Text = cambio.ToString("C");


			}
			catch (Exception ex)
			{
				statusLabel.Text = ex.Message + ex.StackTrace;
			}
		}

		/// <summary>
		/// Saves the client data. and sets it as selected Cliente
		/// </summary>
		/// <param name="conexion">The conexion.</param>
		private void SaveClientData(ref dbConnector conexion)
		{
			if (clientDirty)
			{
				bool clienteNuevo = false;
				if (selectedClient == null)
				{
					selectedClient = new Cliente(ref conexion);
					selectedClient.RFC = txtRFCReceptor.Text.Replace("-", "").Replace(" ", "").ToUpper();
					txtRFCReceptor.AutoCompleteCustomSource.Add(selectedClient.RFC);
					clienteNuevo = true;
				}
				else
				{
					if (selectedClient.RFC.Replace("-", "").Replace(" ", "").ToUpper() != txtRFCReceptor.Text.Replace("-", "").Replace(" ", "").ToUpper())
					{
						selectedClient = new Cliente(ref conexion);
						selectedClient.RFC = txtRFCReceptor.Text.Replace("-", "").Replace(" ", "").ToUpper();
						txtRFCReceptor.AutoCompleteCustomSource.Add(selectedClient.RFC);
						clienteNuevo = true;
					}
					else
						selectedClient = new Cliente(selectedClient.id, ref conexion);
				}

				selectedClient.RazonSocial = txtRazonSocial.Text;
				selectedClient.DireccionFacturacion.Calle = txtCalle.Text;
				selectedClient.DireccionFacturacion.NumeroExterior = txtNoExterior.Text;
				selectedClient.DireccionFacturacion.NumeroInterior = txtNoInterior.Text;
				selectedClient.DireccionFacturacion.Colonia = txtColonia.Text;
				selectedClient.DireccionFacturacion.Ciudad = txtLocalidad.Text;
				selectedClient.DireccionFacturacion.Municipio = txtMunicipio.Text;
				selectedClient.DireccionFacturacion.Estado = txtEstado.Text;
				selectedClient.DireccionFacturacion.CP = txtCP.Text;
				selectedClient.Save();
				if (clienteNuevo)
					clientList.Add(selectedClient);
			}
		}

		/// <summary>
		/// Adds the client data to a Sell
		/// </summary>
		/// <param name="sell">The sell</param>
		private void AddClientData(Venta sell)
		{
			sell.idCliente = selectedClient.id;
			sell.RFCCliente = selectedClient.RFC;
			sell.NombreCliente = selectedClient.RazonSocial;
			sell.NombreComercialCliente = selectedClient.RazonSocial;
			sell.F_Calle = selectedClient.DireccionFacturacion.Calle;
			sell.F_NumeroExterior = selectedClient.DireccionFacturacion.NumeroExterior;
			sell.F_NumeroInterior = selectedClient.DireccionFacturacion.NumeroInterior;
			sell.F_Colonia = selectedClient.DireccionFacturacion.Colonia;
			sell.F_Ciudad = selectedClient.DireccionFacturacion.Ciudad;
			sell.F_Municipio = selectedClient.DireccionFacturacion.Municipio;
			sell.F_Estado = selectedClient.DireccionFacturacion.Estado;
			sell.F_CP = selectedClient.DireccionFacturacion.CP;

		}

		/// <summary>
		/// Generars the venta.
		/// </summary>
		/// <param name="facturarVenta">if set to <c>true</c> [facturar venta].</param>
		private void GenerateSell(bool facturarVenta)
		{
			btnFacturar.Enabled = false;
			btnGuardarCompra.Enabled = false;
			dbConnector conexion = new dbConnector(ConfigurationSettings.AppSettings["cadenaConexion"].ToString());
			//Guardamos los datos del cliente
			SaveClientData(ref conexion);
			Venta venta = new Venta(ref conexion);
			// Anexamos los datos del cliente seleccionado a la venta
			AddClientData(venta);
			venta.SubTotal = WLMFunctions.MonedaADecimal(txtSubTotal.Text);
			venta.IVA = WLMFunctions.MonedaADecimal(txtIVA.Text);
			venta.Descuento = WLMFunctions.MonedaADecimal(txtDescuento.Text);
			venta.DescuentoPorcentaje = WLMFunctions.MonedaADecimal(txtDescPorc.Text);
			venta.Total = WLMFunctions.MonedaADecimal(txtTotal.Text);
            venta.Observaciones = txtObservaciones.Text;
			venta.Save();
			venta.Conceptos = new List<VentaItem>();
			foreach (DataGridViewRow row in gridItems.Rows)
			{
				#region AddingItems
				if (row.Cells[1].Value != null)
				{
					Producto productoNuevo=productList.Find(o => o.Clave == row.Cells["claveItem"].Value.ToString().ToUpper());
					if (productoNuevo == null)
					{

						productoNuevo = new Producto(ref conexion);
						productoNuevo.UnidadMedida = row.Cells["unidadMedida"].Value.ToString();
						productoNuevo.Clave = row.Cells["claveItem"].Value.ToString();
						productoNuevo.Descripcion = row.Cells["Descripcion"].Value.ToString();
						productoNuevo.Precio1 = WLMFunctions.MonedaADecimal(row.Cells["precio"].Value.ToString());
						productoNuevo.Save();
						productList.Add(productoNuevo);
						descriptionsList.Add(productoNuevo.Descripcion.ToUpper());
						codeList.Add(productoNuevo.Clave);
					}
					else
						productoNuevo = new Producto(productoNuevo.id, ref conexion);
					VentaItem item = new VentaItem(ref conexion);
					item.Clave = row.Cells["claveItem"].Value.ToString();
					item.idCotizacion = venta.id;
					item.UnidadMedida = row.Cells["unidadMedida"].Value.ToString();
					item.Descripcion = row.Cells["Descripcion"].Value.ToString();
					item.Precio = WLMFunctions.MonedaADecimal(row.Cells["precio"].Value.ToString());
					item.Cantidad = WLMFunctions.MonedaADecimal(row.Cells["Cantidad"].Value.ToString());
					item.idProducto = 1;
					item.Save();
					productoNuevo.Stock -= item.Cantidad;
					productoNuevo.Save();
					venta.Conceptos.Add(item);
				}
				#endregion
			}

			//FActurando la venta si el boton fue presionado
			if (facturarVenta)
			{
				InvoicesSell(venta, ref conexion);
			}

			Documento doc = new Documento();
			doc.CargarDatos(venta, conexion);
			PDFPrinter.PrintPDF(
				WLMFunctions.TransformXML(doc, @ConfigurationSettings.AppSettings["pathSellNote"].ToString()),
				@ConfigurationSettings.AppSettings["pathSellReceipt"].ToString() + venta.id.ToString("00000000") + ".pdf");
			MessageBox.Show("Se registro Correctamente la Venta en el sistema");
			conexion.CloseConnection();
			CleanFormData();
		}

		/// <summary>
		/// Invoiceses the sell.
		/// </summary>
		/// <param name="sell">The sell.</param>
		/// <param name="dbConection">The db conection.</param>
		private void InvoicesSell(Venta sell, ref dbConnector dbConection)
		{
			//Avoiding invoice generation error for 'Unidad Medida' leaking
			foreach (VentaItem item in sell.Conceptos)
			{
				if (item.UnidadMedida == "" || item.UnidadMedida == null)
					item.UnidadMedida = "pza";
			}
			ResultadoProcesoVenta resultado = sell.Facturar(1M);
			Factura factura= new Factura(resultado.IdFacuraGenerada, ref dbConection);
			FacturaSerie serie = new FacturaSerie(factura.idSerie, ref dbConection);
			string rutaFactura = serie.DirectorioGeneracion + factura.E_RFC + "/" + factura.Serie + "/" + factura.NoFolio.ToString("00000") + "/";
			PDFPrinter.PrintPDF(WLMFunctions.TransformXML(@rutaFactura + factura.ArchivoCFDXML, @ConfigurationSettings.AppSettings["pathInvoice"].ToString()), "Factura " + factura.FullFolio, true);
		}

		/// <summary>
		/// Cleans the form data.
		/// </summary>
		private void CleanFormData()
		{
			txtRFCReceptor.Text = "XXXX000000X0X";
			txtRazonSocial.Text = "Venta al Publico General";
			txtCalle.Text = "";
			txtNoExterior.Text = "";
			txtNoInterior.Text = "";
			txtColonia.Text = "";
			txtLocalidad.Text = "";
			txtMunicipio.Text = "";
			txtEstado.Text = "";
			txtCP.Text = "";

			gridItems.Rows.Clear();
			txtDescPorc.Text = "0.00";
			txtDescuento.Text = "$0.00";
			txtSubTotal.Text = "$0.00";
			txtIVA.Text = "$0.00";
			txtTotal.Text = "$0.00";
            txtObservaciones.Text = "";
			grupoDatosFacturaVenta.Visible = false;
			btnNuevaVenta.Enabled = false;
			btnFacturar.Enabled = false;
			btnGuardarCompra.Enabled = false;
			gridItems.CurrentCell = gridItems.Rows[gridItems.Rows.Count - 1].Cells["claveItem"];
			gridItems.Select();

		}

		/// <summary>
		/// Verifies the invoice data.
		/// </summary>
		/// <returns>true if all sell or invoice data is complete</returns>
		private bool VerifyInvoiceData()
		{
			if (txtRFCReceptor.Text == "") return false;
			if (txtRazonSocial.Text == "") return false;
			if (txtCalle.Text == "") return false;
			if (txtNoExterior.Text == "") return false;
			//if(txtNoInterior.Text == "") return false;
			if (txtColonia.Text == "") return false;
			//if(txtLocalidad.Text = "";
			if (txtMunicipio.Text == "") return false;
			if (txtEstado.Text == "") return false;
			if (txtCP.Text == "") return false;
			if (gridItems.RowCount <= 1) return false;
			return true;
		}

		private bool VerifySellData()
		{
			if (txtRFCReceptor.Text == "") return false;
			if (txtRazonSocial.Text == "") return false;
			return true;
		}

		/// <summary>
		/// Loads the sell note.
		/// </summary>
		/// <param name="sellNoteId">The sell note id.</param>
		private void LoadSellNote(int sellNoteId)
		{
			dbConnector conexion = new dbConnector(ConfigurationSettings.AppSettings["cadenaConexion"].ToString());
			try
			{
				//Cargando la nota de venta y mostrando los detalles de la operacion
				CleanFormData();
				actualSell = new Venta(sellNoteId, true, ref conexion);
				txtRazonSocial.Text = actualSell.NombreCliente;
				txtRFCReceptor.Text = actualSell.RFCCliente;
				txtCalle.Text = actualSell.F_Calle;
				txtNoExterior.Text = actualSell.F_NumeroExterior;
				txtNoInterior.Text = actualSell.F_NumeroInterior;
				txtColonia.Text = actualSell.F_Colonia;
				txtMunicipio.Text = actualSell.F_Municipio;
				txtLocalidad.Text = actualSell.F_Ciudad;
				txtEstado.Text = actualSell.F_Estado;
				txtCP.Text = actualSell.F_CP;
				txtDescPorc.Text = actualSell.DescuentoPorcentaje.ToString();
				txtDescuento.Text = actualSell.Descuento.ToString();
				//Cargamos los items de la venta en el grid de productos
				foreach (VentaItem itemVenta in actualSell.Conceptos)
				{
					string[] row= { 
									  itemVenta.id.ToString(),
									  itemVenta.Cantidad.ToString(),
									  itemVenta.UnidadMedida,
									  itemVenta.Clave,
									  itemVenta.Descripcion,
									  itemVenta.Precio.ToString("C"),
									  (itemVenta.Cantidad*itemVenta.Precio).ToString("C")
								  };
					gridItems.Rows.Add(row);
				}
                txtObservaciones.Text = actualSell.Observaciones;
				lblNoFactura.Text = actualSell.id.ToString();
				grupoDatosFacturaVenta.Visible = true;
				grupoDatosFacturaVenta.Text = "Numero de Venta- " + actualSell.fechaCreacion.ToLongDateString() + " " + actualSell.fechaCreacion.ToLongTimeString();
				if (!actualSell.Facturado)
					btnFacturar.Enabled = true;
				btnNuevaVenta.Enabled = true;
				btnGuardarCompra.Enabled = false;
				UpdateTotals();
			}
			catch (Exception ex)
			{
				statusLabel.Text = ex.Message + " " + ex.StackTrace;
			}
			conexion.CloseConnection();
		}

		/// <summary>
		/// Loads the invoice.
		/// </summary>
		/// <param name="invoiceId">The invoice id.</param>
		private void LoadInvoice(int invoiceId)
		{
			dbConnector conexion = new dbConnector(ConfigurationSettings.AppSettings["cadenaConexion"].ToString());
			try
			{
				//Cargando la nota de venta y mostrando los detalles de la operacion
				CleanFormData();
				Factura factura= new Factura(invoiceId, ref conexion);
				txtRazonSocial.Text = factura.R_RazonSocial;
				txtRFCReceptor.Text = factura.R_RFC;
				txtCalle.Text = factura.R_Calle;
				txtNoExterior.Text = factura.R_NumeroExterior;
				txtNoInterior.Text = factura.R_NumeroInterior;
				txtColonia.Text = factura.R_Colonia;
				txtMunicipio.Text = factura.R_Municipio;
				txtLocalidad.Text = factura.R_Ciudad;
				txtEstado.Text = factura.R_Estado;
				txtCP.Text = factura.R_CP;
				txtDescPorc.Text = factura.Descuento.ToString();
				txtDescuento.Text = factura.Descuento.ToString();
				factura.CargarConceptos();
				//Cargamos los items de la venta en el grid de productos
				foreach (Facturasitems itemVenta in factura.Conceptos)
				{
					string[] row= { 
									  itemVenta.id.ToString(),
									  itemVenta.cantidad.ToString(),
									  itemVenta.Unidad,
									  itemVenta.ClaveProducto,
									  itemVenta.Descripcion,
									  itemVenta.Precio.ToString("C"),
									  (itemVenta.cantidad*itemVenta.Precio).ToString("C")
								  };
					gridItems.Rows.Add(row);
				}
				lblNoFactura.Text = factura.FullFolio;
				grupoDatosFacturaVenta.Visible = true;
				grupoDatosFacturaVenta.Text = "Numero de Factura - " + factura.FechaFacturacion.ToLongDateString() + " " + factura.FechaFacturacion.ToLongTimeString();

				btnNuevaVenta.Enabled = true;
				btnGuardarCompra.Enabled = false;
				btnFacturar.Enabled = false;
				UpdateTotals();
			}
			catch (Exception ex)
			{
				statusLabel.Text = ex.Message + " " + ex.StackTrace;
			}
			conexion.CloseConnection();
		}

		/// <summary>
		/// Generates the invoice.
		/// </summary>
		private void GenerateInvoice()
		{
			if (actualSell.id != 0 && !actualSell.Facturado)
			{
				try
				{
					dbConnector conexion = new dbConnector(ConfigurationSettings.AppSettings["cadenaConexion"].ToString());
					actualSell = new Venta(actualSell.id, true, ref conexion);
					SaveClientData(ref conexion);
					AddClientData(actualSell);
					InvoicesSell(actualSell, ref conexion);
					conexion.CloseConnection();
				}
				catch (Exception ex)
				{

				}
			}
			else
				GenerateSell(true);
		}
		#endregion

		private void productosToolStripMenuItem1_Click(object sender, EventArgs e)
		{
			panelProductos = new frmAltaProducto();
			panelProductos.Show();
			panelProductos.ProductSelected += HandleProductSelect;
			panelProductos.ProductSelected += eventDatosDirty;
			
		}

		private void importarProductosToolStripMenuItem_Click(object sender, EventArgs e)
		{
			FormularioImportador importador= new FormularioImportador();
			importador.Show();
			importador.ImportComplete += HandleImportComplete;

		}

		private void HandleImportComplete(object obj, EventArgs e)
		{
			LoadClientsProducts();
		}

	}
}